package nfe;

import forn.Fornecedores;
import forn.FornecedoresDao;
import java.sql.SQLException;
import java.text.ParseException;
import javax.swing.JOptionPane;
import javax.xml.bind.JAXBException;
import jaxb.Jaxb;
import master.Master;
import util.Util;

/*
 * @author camilo
 */
public class NfeXml {
  
  Fornecedores forn;
  
  public Nfe setClasseNfe(String caminho, Nfe nfe) throws JAXBException, ParseException, SQLException {
//    Nfe nfe = new Nfe();
    //    Inserir aqui os dados do fornecedor
    int i = 0;
    Master.jpStatus.setMaximum(17);
    Master.jpStatus.setValue(i++);
    nfe.setEntidade(this.getForn(caminho));
    FornecedoresDao fdao = new FornecedoresDao();
    forn = fdao.getForn(nfe.getEntidade());
    String numNfe = this.getNumNfe(forn.getId(), caminho);
    if (numNfe == "0") {
      Master.setMessageStatus("NF-e já cadastrada!");
      JOptionPane.showMessageDialog(null, "NF-e já cadastrada!",
              "", JOptionPane.ERROR_MESSAGE);
      return null;
    } else {
      nfe.setNumeroDocumento(Double.parseDouble(numNfe));
    }
    Master.jpStatus.setValue(i++);
    nfe.setSerie(this.getSerie(caminho));
    Master.jpStatus.setValue(i++);
    nfe.setDataEmissao(new Util().formatData(this.getDataEmissao(caminho)));
    Master.jpStatus.setValue(i++);
    if (this.getDataEntrada(caminho) != null) {
      nfe.setDataEntrada(new Util().formatData(this.getDataEntrada(caminho)));
    }
    Master.jpStatus.setValue(i++);
    nfe.setObservacao(this.getObs(caminho));
    Master.jpStatus.setValue(i++);
    nfe.setBaseICMS(Float.parseFloat(this.getBaseIcms(caminho)));
    Master.jpStatus.setValue(i++);
    nfe.setValorICMS(Float.parseFloat(this.getIcms(caminho)));
    Master.jpStatus.setValue(i++);
    nfe.setBaseICMSsub(Float.parseFloat(this.getBaseIcmsS(caminho)));
    Master.jpStatus.setValue(i++);
    nfe.setValorICMSsub(Float.parseFloat(this.getIcmsS(caminho)));
    Master.jpStatus.setValue(i++);
    nfe.setValorProdutos(Float.parseFloat(this.getTotProd(caminho)));
    Master.jpStatus.setValue(i++);
    nfe.setValorNota(Float.parseFloat(this.getTotNf(caminho)));
    Master.jpStatus.setValue(i++);
    nfe.setValorFrete(Float.parseFloat(this.getFrete(caminho)));
    Master.jpStatus.setValue(i++);
    nfe.setValorSeguro(Float.parseFloat(this.getSeguro(caminho)));
    Master.jpStatus.setValue(i++);
    nfe.setValorOutras(Float.parseFloat(this.getOutras(caminho)));
    Master.jpStatus.setValue(i++);
    nfe.setValorDesconto(Float.parseFloat(this.getDesc(caminho)));
    Master.jpStatus.setValue(i++);
    nfe.setValorIPI(Float.parseFloat(this.getIpi(caminho)));
    Master.jpStatus.setValue(i++);
    return nfe;
  }
  
  public String getNumNfe(String forn, String caminho) throws JAXBException, SQLException {
    Master.setMessageStatus("Processando NumNfe...");
    Jaxb nfe = new Jaxb();
    String numNfe = nfe.getXml(caminho).getNFe().get(0).getInfNFe().getIde().getNNF();
    NfeDao nfeDao = new NfeDao();
    Nfe n = new Nfe();
    n = nfeDao.getNumNfe(numNfe, forn);
    if (n.getNumeroDocumento() == null) {
      return numNfe;
    } else {
      return "0";
    }
  }
  
  public String getSerie(String caminho) throws JAXBException {
    Master.setMessageStatus("Processando Serie...");
    Jaxb nfe = new Jaxb();
    String ser = nfe.getXml(caminho).getNFe().get(0).getInfNFe().getIde().getSerie();
    return ser;
  }
  
  public String getDataEmissao(String caminho) throws JAXBException {
    Master.setMessageStatus("Processando DataEmissao...");
    Jaxb nfe = new Jaxb();
    String de = nfe.getXml(caminho).getNFe().get(0).getInfNFe().getIde().getDEmi();
    return de;
  }
  
  public String getDataEntrada(String caminho) throws JAXBException {
    Master.setMessageStatus("Processando DataEntrada...");
    Jaxb nfe = new Jaxb();
    String de = nfe.getXml(caminho).getNFe().get(0).getInfNFe().getIde().getDSaiEnt();
    return de;
  }
  
  public String getForn(String caminho) throws JAXBException {
    Master.setMessageStatus("Processando dados do fornecedor ...");
    Jaxb nfe = new Jaxb();
    String de = nfe.getXml(caminho).getNFe().get(0).getInfNFe().getEmit().getCNPJ();
    return de;
  }
  
  public String getObs(String caminho) throws JAXBException {
    Master.setMessageStatus("Processando observações...");
    String ob;
    try {
      Jaxb nfe = new Jaxb();
      ob = nfe.getXml(caminho).getNFe().get(0).getInfNFe().getInfAdic().getInfCpl();
    } catch (NullPointerException e) {
      return "Importação";
    }
    return ob;
  }
  
  public String getBaseIcms(String caminho) throws JAXBException {
    Master.setMessageStatus("Processando totais (Base de cálculo do ICMS)...");
    Jaxb nfe = new Jaxb();
    String bi = nfe.getXml(caminho).getNFe().get(0).getInfNFe().getTotal().getICMSTot().getVBC();
    return bi;
  }
  
  public String getIcms(String caminho) throws JAXBException {
    Master.setMessageStatus("Processando totais (Valor do ICMS)...");
    Jaxb nfe = new Jaxb();
    String ic = nfe.getXml(caminho).getNFe().get(0).getInfNFe().getTotal().getICMSTot().getVICMS();
    return ic;
  }
  
  public String getBaseIcmsS(String caminho) throws JAXBException {
    Master.setMessageStatus("Processando totais (Base de cálculo do ICMS Substituição)...");
    Jaxb nfe = new Jaxb();
    String bi = nfe.getXml(caminho).getNFe().get(0).getInfNFe().getTotal().getICMSTot().getVBCST();
    return bi;
  }
  
  public String getIcmsS(String caminho) throws JAXBException {
    Master.setMessageStatus("Processando totais (Valor do ICMS Substituição)...");
    Jaxb nfe = new Jaxb();
    String ic = nfe.getXml(caminho).getNFe().get(0).getInfNFe().getTotal().getICMSTot().getVST();
    return ic;
  }
  
  public String getTotProd(String caminho) throws JAXBException {
    Master.setMessageStatus("Processando totais (Valor total dos produtos)...");
    Jaxb nfe = new Jaxb();
    String t = nfe.getXml(caminho).getNFe().get(0).getInfNFe().getTotal().getICMSTot().getVProd();
    return t;
  }
  
  public String getTotNf(String caminho) throws JAXBException {
    Master.setMessageStatus("Processando totais (Valor total da NF-e)...");
    Jaxb nfe = new Jaxb();
    String t = nfe.getXml(caminho).getNFe().get(0).getInfNFe().getTotal().getICMSTot().getVNF();
    return t;
  }
  
  public String getFrete(String caminho) throws JAXBException {
    Master.setMessageStatus("Processando totais (Valor do frete)...");
    Jaxb nfe = new Jaxb();
    String fr = nfe.getXml(caminho).getNFe().get(0).getInfNFe().getTotal().getICMSTot().getVFrete();
    return fr;
  }
  
  public String getSeguro(String caminho) throws JAXBException {
    Master.setMessageStatus("Processando totais (Valor do seguro)...");
    Jaxb nfe = new Jaxb();
    String sg = nfe.getXml(caminho).getNFe().get(0).getInfNFe().getTotal().getICMSTot().getVSeg();
    return sg;
  }
  
  public String getOutras(String caminho) throws JAXBException {
    Master.setMessageStatus("Processando totais (Valor de outras despesas)...");
    Jaxb nfe = new Jaxb();
    String ot = nfe.getXml(caminho).getNFe().get(0).getInfNFe().getTotal().getICMSTot().getVOutro();
    return ot;
  }
  
  public String getDesc(String caminho) throws JAXBException {
    Master.setMessageStatus("Processando totais (Valor de descontos)...");
    Jaxb nfe = new Jaxb();
    String dc = nfe.getXml(caminho).getNFe().get(0).getInfNFe().getTotal().getICMSTot().getVDesc();
    return dc;
  }
  
  public String getIpi(String caminho) throws JAXBException {
    Master.setMessageStatus("Processando totais (Valor do IPI)...");
    Jaxb nfe = new Jaxb();
    String ip = nfe.getXml(caminho).getNFe().get(0).getInfNFe().getTotal().getICMSTot().getVIPI();
    return ip;
  }
}
